package com.aaa.marketresearch.webclient.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

/**
 * @author Nail
 */


@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
@ComponentScan(basePackages = {"com.aaa.marketresearch.webclient.security"})
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    // регистрируем нашу реализацию UserDetailsService
    // а также PasswordEncoder для приведения пароля в формат SHA1
    @Autowired
    public void registerGlobalAuthentication(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(userDetailsService);
                //.passwordEncoder(getShaPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.headers().disable();
        http.csrf()
                .disable()
                        // указываем правила запросов
                        // по которым будет определятся доступ к ресурсам и остальным данным
                .authorizeRequests()
                .antMatchers("/admin/**").permitAll()
                .antMatchers("/client/**").permitAll()
                .antMatchers("/res/**").permitAll()
                .antMatchers("/mobile/**").permitAll()
                .antMatchers("/Index.jsp").permitAll()
                .antMatchers("/view/Admin.jsp").hasRole("ADMIN")
                .antMatchers("/view/Client.jsp").hasAnyRole("ADMIN", "USER")
                .anyRequest().authenticated();


        http.formLogin()
                // указываем страницу с формой логина
                .loginPage("/login/Login.jsp")
                        // указываем action с формы логина
                .loginProcessingUrl("/login/j_spring_security_check")
                        // указываем URL при неудачном логине
                .failureUrl("/login/LoginError.jsp")
                        // Указываем параметры логина и пароля с формы логина
                .usernameParameter("j_username")
                .passwordParameter("j_password")
                        // даем доступ к форме логина всем
                .permitAll();

/*
        http.formLogin()
                // указываем страницу с формой логина
                .loginPage("/urlLogin")
                        // указываем URL при неудачном логине
                .failureUrl("/urlLogin")
                        // даем доступ к форме логина всем
                .permitAll();
*/
        http.logout()
                // разрешаем делать логаут всем
                .permitAll()
                        // указываем URL логаута
                .logoutUrl("/login/Logout.jsp")
                        // указываем URL при удачном логауте
                .logoutSuccessUrl("/login/LogoutSuccess.jsp")
                        // делаем не валидной текущую сессию
                .invalidateHttpSession(true);

    }

    // Указываем Spring контейнеру, что надо инициализировать <b></b>ShaPasswordEncoder
    // Это можно вынести в WebAppConfig, но для понимаемости оставил тут
    @Bean
    public ShaPasswordEncoder getShaPasswordEncoder(){
        return new ShaPasswordEncoder();
    }
/*
    @Bean(name="myAuthenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
*/
}
